package com.qf.thread.compalate;

import java.util.concurrent.*;

public class HandlerDemo {

    public static void main(String[] args) throws ExecutionException, InterruptedException {

        // 创建一个线程池
        ThreadPoolExecutor executor = new ThreadPoolExecutor(
                5,
                20,
                2000,
                TimeUnit.SECONDS,
                new LinkedBlockingQueue<Runnable>(10000),
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.AbortPolicy()
        );


        CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> {
            System.out.println("线程1执行计算任务");
            int sum = 10 / 0;
            return "sum:" + sum;
        }, executor) // 启动一个先从去做计算任务
                .whenCompleteAsync((resp, exc) -> { // 上线线程计算完成，在申请一个线程执行这个任务
                    //resp:上一个线程的返回结果
                    // exc:抛出的异常
                    System.out.println("线程1计算任务执行结束:resp:" + resp);
                }, executor).exceptionally((resp) -> { // 上面那个线程运行出现异常后会调用这个方法，这个方法可以做降级
                    // resp:上一个线程的返回结果
                    System.out.println("线程1中出现异常会执行，返回有返回值是200,返回值就会被作为线程1任务的返回值");
                    return "200;";
                })
                .handle((resp, exc) -> {
                    System.out.println("不管线程1是否会出现异常，都会执行，该方法的返回值最终被作为线程1的返回值，resp:" + resp);
                    return "300";
                });

        String s = future2.get();
        System.out.println(s);
    }
}
